home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-08-31 | 11.4 KB | 302 lines | [TEXT/CCL ] |
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; Copyright 1987, 1988, 1989, 1990 by Ruben Kleiman for Apple Computer, Inc.
- ;;; Advanced Technology Group
- ;;;
- ;;; Acknowledgements: Thanks to Matthew MacLaurin for tweaking LOOKUP-NAMES
- ;;; and for adding NBP-LOOKUP-NAMES
- ;;; Thanks to Bill Luciw for doing the arithmetic bit on LOOKUP-NAMES
- ;;;
-
- ;;;
- ;;; NBP AppleTalk Driver
- ;;;
-
-
- (in-package :network :use '(ccl system lisp))
-
- (export '(check-nbp-driver
- NBP-lookup))
-
- (eval-when (eval load compile)
- (require :traps)
- (require :driver))
-
- ;;; ------------------
- ;;; General offsets
- (defconstant $MPPIoRefNum -10) ; The .MPP driver (used by .NBP)
- (defconstant $ioResult 16)
- ;;;(defconstant $ioRefNum 24) ; from driver.lisp
- ;;;(defconstant $ioPermssn 27) ; from driver.lisp
- ;;;(defconstant $csCode 26) ; from driver.lisp
- (defconstant $interval 28) ; byte
- (defconstant $count 29) ; byte
- (defconstant $ntQElPtr 30) ; pointer
- (defconstant $verifyFlag 34) ; byte
- (defconstant $entityPtr 30) ; pointer
- (defconstant $retBuffPtr 34) ; pointer
- (defconstant $retBuffSize 38) ; word
- (defconstant $maxToGet 40) ; word
- (defconstant $numGotten 42) ; word
-
- (defconstant $tupleNet 0)
- (defconstant $tupleNode 2)
- (defconstant $tupleSkt 3)
-
- ;;; ------------------
- ;;; Entity Name Record Offsets
- (defconstant $NextEntryPtr 0) ; longword
- (defconstant $Net 4) ; word
- (defconstant $Node 6) ; byte
- (defconstant $Skt 7) ; byte
- (defconstant $Name 9) ; start of name string
-
- ;;; ------------------
- ;;; Send self flags
- (defconstant $setSelfSend 256)
- (defconstant $NewSelfFlag 28) ; byte
- (defconstant $OldSelfFlag 29) ; byte
-
- ;;; ------------------
- ;;; NBP Routine CsCodes
- (defconstant $registerName 253)
- (defconstant $confirmName 250)
- (defconstant $removeName 252)
- (defconstant $loadNBP 249)
- (defconstant $lookUpName 251)
-
- (defrecord EntityName
- (objStr (string 32))
- (typeStr (string 32))
- (zoneStr (string 32)))
-
- ;;; -------------------------------------------------------------------------
- ;;; *nbp-driver* DEFINITIONS
-
- (defobject *nbp-driver* nil)
-
- ;;; Note: We are actually interfacing with the MPP driver throughout this!
- (defobfun (exist *nbp-driver*) (init-list)
- (usual-exist init-list)
- (have 'driver-name (getf init-list :driver-name ".NBP"))
- (have 'driver-open-p nil)
- (have 'driver-pb (_NewPtr :errchk :d0 80 :a0))
- (%put-byte driver-pb 0 $ioPermssn)
- (%put-word driver-pb $MPPIoRefNum $ioRefNum)) ; the .NBP "driver" actually uses the .MPP driver!
-
- ;;; --------------------------------------------
- ;;; Some generic functions
-
-
- (defun make-AddrBlock (&key (aNet 0) (aNode 0) (aSocket 0))
- (+ (* aNet 65536) (* aNode 256) aSocket))
-
- (defvar *the-NBP-driver* nil)
-
- (defun check-NBP-driver ()
- "Create and open the NBP driver, if necessary"
- (or *the-NBP-driver*
- (setq *the-NBP-driver* (oneOf *nbp-driver*)))
- (or (ask *the-NBP-driver* driver-open-p)
- (ask *the-NBP-driver* (driver-open))))
-
- (defun NBP-register (name type socket)
- (ask *the-NBP-driver* (register-name name type socket)))
-
- (defun NBP-unregister (name type)
- (ask *the-NBP-driver* (unregister-name name type)))
-
- (defun NBP-lookup (name type)
- (ask *the-NBP-driver* (lookup-single-name name type)))
-
- (defun NBP-lookup-names (type) ;m000
- (ask *the-NBP-driver* (lookup-names type)))
-
- (defun allow-local-loopback ()
- (check-nbp-driver)
- (ask *the-NBP-driver* (SetSelfSend)))
-
- (defun NBP-handle-error (ioResult)
- (or (= ioResult 0)
- (= ioResult 1)
- (cerror "KEEP ON TRUCKIN' ..."
- (case ioResult
- (-1024 "NBP buffer overflow (~a)")
- (-1026 "NBP name confirmed for different socket (~a)")
- (-1027 "NBP duplicate name already exists (~a)")
- (-1029 "NBP names information socket error (~a)")
- (-1025 "NBP name not confirmed (~a)")
- (-1028 "NBP name not found (~a)")
- (-1029 "NBP names information socket error (~a)")
- (-3104 "NBP can't find tuple in buffer (~a)")
- (OTHERWISE "ADSP Unknown error (~a)"))
- ioResult)))
-
- ;;; --------------------------------------------
-
- ;;; Methods:
- ;;; driver-open ::= Will load the NBP driver into your system (usually already there)
- ;;; register-name ::= Give it an existing socket number, a name & type for it,
- ;;; and it will register it in the AppleTalk network for you.
- ;;; unregister-name ::= Give it a socket number, and it will unregister
- ;;; it from the AppleTalk network.
- ;;; lookup-name ::= Give it an entity name pointer, and it will tell you
- ;;; whether anyone is registered in the network with that name.
- ;;; SetSelfSend ::= Makes sure that your system can send messages to itself
-
- (defobfun (driver-control *nbp-driver*) (code)
- "Do a driver control trap"
- (if (not driver-open-p) (error "Driver: ~s is not open" (self)))
- (%put-word driver-pb code $csCode)
- (_Control :a0 driver-pb))
-
- (defobfun (SetSelfSend *nbp-driver*) (&optional (on 1))
- "Enables node to talk to itself"
- (%put-byte driver-pb on $NewSelfFlag)
- (driver-control $setSelfSend)
- (NBP-handle-error (%get-signed-word driver-pb $ioResult)))
-
- (defobfun (driver-open *nbp-driver*) ()
- "Load NBP Services"
- (setq driver-open-p t)
- (driver-control $loadNBP)
- (NBP-handle-error (%get-signed-word driver-pb $ioResult)))
-
- (defobfun (register-name *nbp-driver*)
- (name type socket &optional (node 0) &key (check-duplicate-p t) &aux NameTablePtr)
- "Registers socket at node under name of given type"
- (check-nbp-driver)
- (setq NameTablePtr ; should probably use a %stack-block let here...
- (_NewPtr :check-error :d0 (+ (length name) (length type) 20) :a0)) ; becomes property of NBP
- (%put-byte driver-pb 8 $interval)
- (%put-byte driver-pb 3 $count)
- (%put-byte driver-pb check-duplicate-p $verifyFlag)
- ;; Fill-in name table entry
- (%put-word NameTablePtr 0 $Net)
- (%put-byte NameTablePtr node $Node)
- (%put-byte NameTablePtr socket $Skt)
- (%put-string NameTablePtr name $Name)
- (%put-string NameTablePtr type (+ $Name (length name) 1))
- (%put-string NameTablePtr "*" (+ $Name (length name) (length type) 2))
- (%put-ptr driver-pb NameTablePtr $ntQElPtr)
-
- (driver-control $registerName)
- (NBP-handle-error (%get-signed-word driver-pb $ioResult)))
-
- (defobfun (unregister-name *nbp-driver*) (name type)
- "Unregisters socket"
- (check-nbp-driver)
- (%stack-block ((entityNamePtr 70))
- (%put-string entityNamePtr name)
- (%put-string entityNamePtr type (+ (length name) 1))
- (%put-string entityNamePtr "*" (+ (length name) (length type) 2))
- (%put-ptr driver-pb entityNamePtr $entityPtr)
-
- (driver-control $removeName)
- (NBP-handle-error (%get-signed-word driver-pb $ioResult))))
-
- (defobfun (lookup-single-name *nbp-driver*) (name type)
- "Check whether server of name and type is registered and return its internet address"
- (check-nbp-driver)
- (%stack-block ((entityNamePtr 70)
- (lookUpDataPtr 40)) ; where answers will be deposited
- (%put-string entityNamePtr name)
- (%put-string entityNamePtr type (+ (length name) 1))
- (%put-string entityNamePtr "*" (+ (length name) (length type) 2))
- (%put-ptr driver-pb entityNamePtr $entityPtr)
- (%put-ptr driver-pb lookUpDataPtr $retBuffPtr)
- (%put-byte driver-pb 1 $interval)
- (%put-byte driver-pb 3 $count)
- (%put-word driver-pb 40 $retBuffSize)
- (%put-word driver-pb 3 $maxToGet)
- (%put-word driver-pb 0 $numGotten)
-
- (driver-control $lookUpName)
- (NBP-handle-error (%get-signed-word driver-pb $ioResult))
-
- (cond ((> (%get-word driver-pb $numGotten) 0) ; succeeded!
- (values t
- (make-AddrBlock :aNet (%get-word lookupDataPtr $tupleNet)
- :aNode (%get-byte lookupDataPtr $tupleNode)
- :aSocket (%get-byte lookupDataPtr $tupleSkt))))
- ((= (%get-byte driver-pb $count) 0) nil)))) ; failed
-
-
- (defobfun (lookup-names *nbp-driver*) (type)
- "Returns internet addresses for servers registered under this type"
- (check-nbp-driver)
- (%stack-block ((entityNamePtr 70)
- (lookUpDataPtr 320))
- (%put-string entityNamePtr "=")
- (%put-string entityNamePtr type 2)
- (%put-string entityNamePtr "*" (+ 3 (length type)))
- (%put-ptr driver-pb entityNamePtr $entityPtr)
- (%put-ptr driver-pb lookUpDataPtr $retBuffPtr)
- (%put-byte driver-pb 1 $interval)
- (%put-byte driver-pb 3 $count)
- (%put-word driver-pb 320 $retBuffSize)
- (%put-word driver-pb 8 $maxToGet)
- (%put-word driver-pb 0 $numGotten)
-
- (driver-control $lookUpName)
- (NBP-handle-error (%get-signed-word driver-pb $ioResult))
-
- (let ((ofst 0) (tmp 0) (addresses '())) ;m000
- (cond ((> (%get-word driver-pb $numGotten) 0)
- (values t
- (dotimes (n (%get-word driver-pb $numGotten)
- (if (= 1 (length addresses))
- (car addresses)
- addresses))
- (push (make-AddrBlock :aNet (%get-word lookupDataPtr
- ofst)
- :aNode (%get-byte lookupDataPtr
- (+ ofst 2))
- :aSocket (%get-byte lookupDataPtr
- (+ ofst 3)))
- addresses)
- (setq tmp (%get-byte lookupDataPtr (+ ofst 5)))
- (setq tmp (+ tmp (%get-byte lookupDataPtr (+ ofst tmp 6))))
- (setq tmp (+ tmp (%get-byte lookupDataPtr (+ ofst tmp 7))))
- (setq ofst (+ ofst tmp 8))
- )))
- ((= (%get-byte driver-pb $count) 0) nil)))))
-
- (defobfun (lookup-anames *nbp-driver*) (type)
- "Returns object names for servers registered under this type"
- (check-nbp-driver)
- (%stack-block ((entityNamePtr 70)
- (lookUpDataPtr 320))
- (%put-string entityNamePtr "=")
- (%put-string entityNamePtr type 2)
- (%put-string entityNamePtr "*" (+ 3 (length type)))
- (%put-ptr driver-pb entityNamePtr $entityPtr)
- (%put-ptr driver-pb lookUpDataPtr $retBuffPtr)
- (%put-byte driver-pb 1 $interval)
- (%put-byte driver-pb 3 $count)
- (%put-word driver-pb 320 $retBuffSize)
- (%put-word driver-pb 8 $maxToGet)
- (%put-word driver-pb 0 $numGotten)
-
- (driver-control $lookUpName)
- (NBP-handle-error (%get-signed-word driver-pb $ioResult))
-
- (let ((ofst 0) (tmp 0) (names nil))
- (cond ((> (%get-word driver-pb $numGotten) 0)
- (values t
- (dotimes (n (%get-word driver-pb $numGotten)
- (if (= 1 (length names))
- (car names)
- names))
- (push (%get-string lookupDataPtr (+ ofst 5))
- names)
- (setq tmp (%get-byte lookupDataPtr (+ ofst 5)))
- (setq tmp (+ tmp (%get-byte lookupDataPtr (+ ofst tmp 6))))
- (setq tmp (+ tmp (%get-byte lookupDataPtr (+ ofst tmp 7))))
- (setq ofst (+ ofst tmp 8))
- )))
- ((= (%get-byte driver-pb $count) 0) nil)))))
-
-
-
- (push :nbp *features*)
- (provide :nbp)